﻿/***************************
 * Author：peiyang
 * DateTime：
 * Description：<Description>
 * Copyright：臭皮匠工作室@2020
 **/

using System;
using System.Collections.Generic;
using Cpjit.SunnyPaine.Toolkit.RabbitMQ.Enums;
using Cpjit.SunnyPaine.Toolkit.RabbitMQ.Model;

namespace Cpjit.SunnyPaine.Toolkit.RabbitMQ
{
    /// <summary>
    /// 提供消费者接口信息。
    /// </summary>
    public interface IConsumer : IDisposable
    {
        /// <summary>
        /// 消息通道。
        /// </summary>
        ConsumerMetaObject MetaObject { get; set; }
        
        /// <summary>
        /// RabbitMQ客户端对象。
        /// </summary>
        IRabbitmqClient RabbitmqClient { get; set; }

        /// <summary>
        /// 消息工作模式。
        /// </summary>
        WorkMode Mode { get; set; }

        /// <summary>
        /// 交换器名称。如果消息工作模式基于交换器的话。
        /// </summary>
        string ExchangeName { get; set; }

        /// <summary>
        /// 队列名称。
        /// </summary>
        string QueueName { get; set; }

        /// <summary>
        /// 路由键，如果消息工作模式基于交换器的定向路由模式（direct）的话。通配符，如果消息工作模式基于交换器的通配符模式（topic）的话。
        /// </summary>
        string RoutingKey { get; set; }
        
        /// <summary>
        /// 消费者消费消息后是否自动应答。默认true。
        /// </summary>
        bool AutoAck { get; set; }

        /// <summary>
        /// 附加属性。
        /// </summary>
        IDictionary<string, object> Arguments { get; set; }

        /// <summary>
        /// 是否订阅。true：订阅，false：不订阅。
        /// <para>如果为false，即便是实现了IConsumer接口也不会订阅消息。</para>
        /// </summary>
        bool IsSubscribed { get; set; }

        /// <summary>
        /// 接收消息。
        /// </summary>
        /// <param name="client">表示句柄对象。</param>
        /// <param name="args">接收的消息数据事件信息。</param>
        void Receive(IRabbitmqClient client, DataEventArgs args);
    }
}